#include <bits/stdc++.h>
#define ll long long
#define lowbit(x) (x&-x)
using namespace std;

const int Maxn=3e5+7,Maxm=2020;
int dp[Maxm][Maxm];

int n,p[Maxn];

class BIT1{
	public:
		inline void init(int l){sz=l;}
		inline void add(int x,int k){ ++x;
			while(x<=sz) tr[x]=max(tr[x],k),x+=lowbit(x);
		}
		inline int query(int x){
			int s=0; ++x;
			while(x) s=max(s,tr[x]),x-=lowbit(x);
			return s;
		}
	private:
		int tr[Maxm],sz;
}t1[Maxm];
class BIT2{
	public:
		inline void init(int l){sz=l;}
		inline void add(int x,int k){ ++x;
			while(x) tr[x]=max(tr[x],k),x-=lowbit(x);
		}
		inline int query(int x){
			int s=0; x++;
			while(x<=sz) s=max(s,tr[x]),x+=lowbit(x);
			return s;
		}
	private:
		int tr[Maxm],sz;
}t2[Maxm];
class BIT4{
	public:
		inline void init(int l){sz=l;}
		inline void add(int x,int k){ ++x;
			while(x) tr[x]=max(tr[x],k),x-=lowbit(x);
		}
		inline int query(int x){
			int s=0; x++;
			while(x<=sz) s=max(s,tr[x]),x+=lowbit(x);
			return s;
		}
	private:
		int tr[Maxn],sz;
}t4;

#define pii pair<int,int>
#define mk make_pair
#define fi first
#define se second
class BIT3{
	public:
		inline void init(int l){sz=l;}
		inline void add(int x,pii k){ ++x;
			while(x<=sz) tr[x]=max(tr[x],k),x+=lowbit(x);
		}
		inline pii query(int x){
			pii s=mk(0,0); ++x;
			while(x) s=max(s,tr[x]),x-=lowbit(x);
			return s;
		}
	private:
		pii tr[Maxn];
		int sz;
}t3;

int lst[Maxn];

int main(){
	freopen("shung.in","r",stdin);
	freopen("shung.out","w",stdout); 

	scanf("%d",&n);
	for(int i=1;i<=n;i++) scanf("%d",&p[i]);
	
	if(n<=2000){
		for(int i=0;i<=n;i++) t1[i].init(n+2),t2[i].init(n+2);
	
		for(int i=1;i<=n;i++)
			for(int j=1;j<=n;j++){
				if(i==j) continue;
				dp[i][j]=max(t1[j].query(p[i]),t2[i].query(p[j]))+1;
				t1[j].add(p[i],dp[i][j]); t2[i].add(p[j],dp[i][j]);
			}
		int tag1=1,tag2=1;
		for(int i=2;i<=n;i++) tag1&=(p[i]>p[i-1]),tag2&=(p[i]<p[i-1]);
		int ans=0;
		if(tag1 or tag2) ans=n; 
		for(int i=0;i<=n;i++)
			for(int j=0;j<=n;j++)
				ans=max(ans,dp[i][j]);
		printf("%d",ans);
		return 0;
	}
	else{
		t3.init(n+4),t4.init(n+4);
		
		int ans=0,mx=0,ret=0;
		for(int i=1;i<=n;i++){
			pii o=t3.query(p[i]);
			lst[i]=o.se; o.fi++; o.se=i;
			t3.add(p[i],o);
			if(o.fi>ans) ans=o.fi,mx=i;
		}
		while(mx) p[mx]=-1,mx=lst[mx];
		for(int i=1;i<=n;i++){
			if(p[i]==-1) continue;
			int o=t4.query(p[i])+1;
			t4.add(p[i],o);
			ret=max(ret,o);
		}
		printf("%d\n",ans+ret);		
		return 0;
	}
	

	return 0;
}

